草庐IT

Java final 与 C++ const

全部标签

c++ - 为什么不同类型的变量可以用作 C++ 中 const 引用参数的参数的参数

voidfoo(constint&v){intx=v;std::cout正在传递y来代替C++中合法的constint& 最佳答案 有两个因素可以让您的代码正常工作。首先,如果允许函数参数匹配重载,则允许函数参数最多进行一次隐式转换。其次,const引用可以绑定(bind)到临时对象。这里发生的是y隐式转换为int,创建一个临时拷贝。v然后绑定(bind)到那个临时的。考虑以下示例:#includevoidfoo(constunsignedint&v){std::cout您会发现foo(y)打印出与y相同的地址,而bar(y)打印出

c++ - 为什么从 lambda 返回 const 引用会导致临时引用?

我有一个情况,我有一个成员返回一个const&,然后这个结果在一个具有相同返回类型的lambda中转发。MSVC2017将这种情况识别为有风险,并发出警告:returningaddressoflocalvariableortemporary。使用clang和其他编译器进行的实证测试表明这是全面的。我不明白的是,为什么这与几个返回相同类型的方法调用不同。例如,这非常有效:classA{public:conststd::string&name()const{returnm_name;}private:std::stringm_name;};classB{public:conststd::s

c++ - 如何在失败的情况下返回 const QString 引用?

考虑以下代码:constQString&MyClass::getID(intindex)const{if(iid;//idisaQString}else{returnmy_global_empty_qstring;//isaglobalemptyQString}}如何在不更改方法的返回类型的情况下避免出现空的QString?(似乎返回分配在堆栈上的空QString是个坏主意)谢谢。 最佳答案 你不能。要么不返回const引用,要么像这样使用局部静态变量:constQString&MyClass::getID(intindex)con

c++ - '从 some_type** 到 const some_type** 的无效转换'

我有一个函数需要constsome_type**作为参数(some_type是一个结构,函数需要一个指向这种类型数组的指针).我声明了一个some_type*类型的局部变量,并对其进行了初始化。然后我将该函数称为f(&some_array),编译器(gcc)说:error:invalidconversionfrom‘some_type**’to‘constsome_type**’这里有什么问题?为什么我不能将变量转换为常量? 最佳答案 参见:Whycan'tIpassachar**toafunctionwhichexpectsaco

c++ - 从(指向 const 的指针)到(指向非常量的指针)的强制转换是否无效 C++?

我确信下面的代码不应该编译。但是,在g++中,它确实可以编译!在http://codepad.org/MR7Dsvlz查看编译.代码:#includeusingnamespacestd;intmain(){intx=32;//note:ifxis,instead,aconstint,thecodestillcompiles,//buttheoutputis"32".constint*ptr1=&x;*((int*)ptr1)=64;//questionablecastcout编译g++是不是出错了? 最佳答案 没有。根据C++标准的

c++ - `T&` 和 `const T&` 对于 all-const 类的区别

假设我有这样一个类:classFoo:boost::noncopyable{public:Foo(inta,intb);constintsomething;constintsomething_else;conststd::stringanother_field;//andthat'sthat,nomoremethodsnorfields};现在,通过Foo&访问此类的对象与通过constFoo&访问此类的对象之间有什么实际区别,除了这两者是两种不同的类型?访问其字段应该没有任何区别,因为它们是const,因此将通过constT&无论如何。但是对于整个类(class)而言,有什么不同吗?

c++ - try block 限制 const 变量的范围

当包装一个常量的初始化时,我经常遇到范围问题try{constintvalue=might_throw();}std::cout目前我使用临时值作为解决方法。有没有更好的方法来处理const-try{}情况?inttmp;/*I'dratherhavetmpconst*/try{tmp=might_throw();}catch(...){/*dosomething*/}constintvalue=tmp; 最佳答案 代替你的inttmp;/*I'dratherhavetmpconst*/try{tmp=might_throw();}

c++ - 在 C++ 中使用 const 的指针和符号位置

这个问题在这里已经有了答案:关闭9年前。PossibleDuplicate:Declaringpointers;asteriskontheleftorrightofthespacebetweenthetypeandname?我一直想知道放置*和&的确切正确位置是什么。似乎C++对放置这些标记的位置相当宽容。例如,我似乎将指针和符号放在关键字的左右两侧或两个关键字的中间,但令人困惑的是,有时它们似乎意味着同一件事,尤其是与const一起使用时>voidf1(structure_typeconst¶meter)voidf2(structure_typeconst¶meter

c++ - 以下使用 const_cast 是未定义的行为吗?

这个问题在这里已经有了答案:Isconst-castingawayconst-nessofreferencestoactualconstobjectspermittediftheyarenevermodifiedthroughthem?(2个答案)关闭2年前。这是一个语言律师问题,不是一个好的实践问题。以下代码是有效的还是未定义的行为?一个const对象最终会调用一个非常量函数,但它实际上并没有修改对象的状态。structBob{Bob():a(0){}int&GetA(){returna;}constint&GetA()const{returnconst_cast(*this).Ge

c++ - 基于范围的 for 循环与 const shared_ptr<>

我有一个容器shared_ptr,例如一个vector>v我想遍历v表示常量。这段代码:vector>v;v.push_back(make_shared("hallo"));...for(constauto&s:v){*s+=".";//看起来就像我想做的(表示s是const)但当然它不会生成字符串const.有没有一种优雅的方法来遍历shared_ptr的容器?这表明内容不会被修改?有点像for(shared_ptrs:v){*s+=".";//(但由于其他原因这段代码无法编译:))编辑:我错了。最初我是在声明一个引用,这导致编译器错误for(shared_ptr&s:v){//如果